package com.ls.lserp.modules.setting.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ls.lserp.common.persistence.Page;
import com.ls.lserp.common.service.CrudService;
import com.ls.lserp.common.utils.CacheUtils;
import com.ls.lserp.common.utils.CollectionsUtils;
import com.ls.lserp.modules.setting.dao.CategoryDao;
import com.ls.lserp.modules.setting.entity.Category;
import com.ls.lserp.modules.sys.utils.DictUtils;



/**
  * @ClassName: CategoryService
  * @Description: 分类保存 修改 删除
  * 
  * @author 
  * @date 2017年1月24日 下午3:06:41
  *
  */

@Service
@Transactional(readOnly = true)
public class CategoryService extends CrudService<CategoryDao, Category> {
	@Autowired
	
	// 分类方法接口
	private CategoryDao categoryDao;
	
    /**
      * @Title: findList
      * @Description: 一览查询
      * @param @param page
      * @param @param Category
      * @param @return
      * @return Page<Category> 
      * @throws
      */
    
    public Page<Category> findList(Page<Category> page, Category category) {
        
    	// 设置分页参数
    	category.setPage(page);
        
    	// 执行分页查询
        page.setList(categoryDao.findList(category));
        
        return page;
    }
    
	/**
	  * @Title: getCategory
	  * @Description: 基本信息查询
	  * @param @param id
	  * @param @return
	  * @return Category 
	  * @throws
	  */
	
	public Category getCategory(Long id){
	        return categoryDao.get(id);
	    }

    /**
      * @Title: findSubCategory
      * @Description: 查询子项目
      * @param @param page
      * @param @param Category
      * @param @return
      * @return List<Category> 
      * @throws
      */
    
    public List<Category> findSubCategory(Page<Category> page, Category Category) {
        // 执行查询
        return categoryDao.findSubCategory(Category);
    }

    /**
      * @Title: findSubCategory
      * @Description: 查询子项目
      * @param @param Category
      * @param @return
      * @return List<Category> 
      * @throws
      */
    
    public List<Category> findSubCategory( Category Category) {
        // 执行查询
        return categoryDao.findSubCategory(Category);
    }

	/**
	  * @Title: saveCategory
	  * @Description: 保存分类
	  * @param @param category
	  * @return void 
	  * @throws
	  */
	
	@Transactional(readOnly = false)
	public void saveCategory(Category category) {
		
		// 判断新建编辑
		//若为null 执行插入语句（新建）
		if (category.getId()==null){
		    category.preInsert();
			categoryDao.insert(category);
			
		// 编辑
		}else{
			// 更新数据
		    category.preUpdate();
			categoryDao.update(category);
		}
		
		// 删除子项
		categoryDao.physicallyDeleteAllSub(category);
		
		// 判断list是否为空
		if(!CollectionsUtils.isEmpty(category.getCategoryList())){
			
		// 遍历赋值
        for( Category  c: category.getCategoryList() ){
        		//创建人信息
        		c.preInsert();
        		
        		// 将数据值赋给list（关联数据）
				c.setItemCode(category.getItemValue());
			}
        
        // 执行子项插入语句
        categoryDao.insertAllSub(category);
		}
		
		// 清空基础数据
		CacheUtils.remove(DictUtils.CACHE_DICT_MAP);
		CacheUtils.remove(DictUtils.CACHE_DICT_VALUE_MAP);
	}

	/**
	  * @Title: deleteCategory
	  * @Description: 删除分类(逻辑删除)
	  * @param @param category
	  * @return void 
	  * @throws
	  */
	
	@Transactional(readOnly = false)
	public void deleteCategory(Category category) {
		// 执行逻辑删除子项
		categoryDao.logicDeleteAllSub(category);
		// 执行逻辑删除
		categoryDao.delete(category);
		
		// 清空基础数据
        CacheUtils.remove(DictUtils.CACHE_DICT_MAP);
        CacheUtils.remove(DictUtils.CACHE_DICT_VALUE_MAP);
	}

	/**
	  * @Title: physicallyCategoryDeleteAllSub
	  * @Description: 物理删除
	  * @param @param category
	  * @return void 
	  * @throws
	  */
	
	@Transactional(readOnly = false)
	public void physicallyCategoryDeleteAllSub(Category category) {
		
		// 执行物理删除子项数据
		categoryDao.physicallyDeleteAllSub(category);
		
	}
	
	/**
	  * @Title: getItemValue
	  * @Description: 查重
	  * @param @param itemValue 数据值
	  * @param @param itemCode  数据代码
	  * @param @return
	  * @return Category 
	  * @throws
	  */
	
	public Category getItemValue(String itemValue) {
		
		// 实力化
		Category category = new Category();
		
		category.setItemValue(itemValue);
		
		// 通过数据值和数据代码查询
		return categoryDao.getByItemValue(category);
	}
	
	/**
	  * @Title: getItemCode
	  * @Description: 
	  * @param @param itemValue
	  * @param @return
	  * @return Category 
	  * @throws
	  */
	
	public Category getItemCode(String itemValue) {
		
		// 实力化
		Category category = new Category();
		
		category.setItemValue(itemValue);
		
		// 通过数据值和数据代码查询
		return categoryDao.getByItemCode(category);
	}
}
